import urllib.request
from lxml import etree
import json
import re

class Spider(object):
    def __init__(self):
        # 起始页位置
        self.begin_page = int(input("请输入起始页："))
        # 终止页位置
        self.end_page = int(input("请输入终止页："))
        # 基本URL
        self.base_url = "https://www.0315.cc/job/fulllist_20_"

    def load_page(self):
        """
            @brief 定义一个url请求网页的方法
            @param page 需要请求的第几页
        """
        user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.56 Safari/537.36"
        headers = {"User-Agent": user_agent}
        html = ''
        for page in range(self.begin_page, self.end_page + 1):
            url = self.base_url + str(page) + "_0_-1_0_0_0_0_0_-1_-1_-1_0.html?search=-1"
            request = urllib.request.Request(url, headers=headers)
            # 获取每页HTML源码字符串
            response = urllib.request.urlopen(request)
            # 读取response中的内容并解码及将特殊字符替换成空
            html += response.read().decode("utf-8").replace('\xa0', '')
        return html

    # 使用lxml库解析网页数据
    def parse_page(self, html):
        """
            @brief      定义一个解析网页的方法
            @param html 服务器返回的网页HTML
        """
        html_list = re.findall('<html>.*?</html>', html, re.S)
        # print(len(html_list))
        for html in html_list:
            # 从字符串中解析HTML文档或片段，返回根节点
            root = etree.HTML(html)
            # 查找所有的职位名称
            names_list = root.xpath('.//div[@class="left"]/h3/a/text()')
            # 查找所有的详情链接
            links = root.xpath('.//div[@class="left"]/h3/a/@href')
            # 查找所有的职位类别
            # categorys = root.xpath('//div[@class="g-desc01"]/p/text()[1]')
            categorys = root.xpath('.//div[@class="right"]/div/p/text()[1]')
            # 查找招聘公司名称
            company_list = root.xpath('.//div[@class="right"]/h3/a/text()')
            # company_list = root.xpath('//div[@class="right"]/h3/a')
            # 查找所有的工作地点
            locations = root.xpath('.//div[@class="g-desc01"]/p/span')
            # 查找所有的发布时间
            publish_times = root.xpath('//span[@class="time"]')
            #查找更新时间
            update_times = root.xpath('.//div[@class="date"]/span/text()')
            #更新链接
            self.base_url_update = "https://www.0315.cc/job/"
            # 定义空列表，以保存元素的信息
            items = []
            for i in range(0, len(names_list)):
                item = {}
                item["职位名称"] = names_list[i]
                item["详情链接"] = self.base_url_update + links[i]
                item["职位类别"] = categorys[i]
                item["公司名称"] = company_list[i]
                # item["公司名称"] = company_list[i].text
                item["工作地点"] = locations[i].text
                item["发布时间"] = publish_times[i].text
                item["更新时间"] =update_times[i]
                items.append(item)
            print(items)
            self.save_file(items)

    # 创建保存数据函数
    def save_file(self, items):
        """
            @brief       将数据追加写进文件中
            @param html 文件内容
        """
        with open('./work2.json', 'w',encoding='utf-8') as fp:
            json.dump(items, fp=fp, ensure_ascii=False, indent=4)

if __name__ == '__main__':
    # 测试是否返回网页源码
    # 测试正则表达式/ lxml库/ bs4库
    spider = Spider()
    return_html = spider.load_page()
    # print(return_html)
    spider.parse_page(return_html.replace('\u2795', ''))
